package com.chat.api.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.chat.api.utils.util.DateUtil;
import lombok.SneakyThrows;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/* 解析监听器，
 * 每解析一行会回调invoke()方法。
 * 整个excel解析结束会执行doAfterAllAnalysed()方法
 */
public class ExcelListener extends AnalysisEventListener<Object> {

    //自定义用于暂时存储data。
    //可以通过实例获取该值
    private List<List<String>> datas = new ArrayList<>() ;

//    public void invoke(Object object, AnalysisContext context) {
//        List list = (List) object;
//        int size = list.size();
//        Integer currentRowNum = context.getCurrentRowNum();
//        if (currentRowNum == 0){
//            list .removeAll(Collections.singleton(null)); //移除所有的null元素
//            int size2 = list.size();
//            if (size != size2){
//                throw new FormatterClosedException();
//            };
//        }
////        list .removeAll(Collections.singleton(null)); //移除所有的null元素
//        for (int i = 0; i < list.size(); i++) {
//            if (list.get(i) == null){
//                list.set(i,"");
//            }
//        }
//        if (list.isEmpty()){
//            return;
//        }
//        List<String> valueList = (List<String>) object;
//        datas.add(valueList);
//    }

    private void doSomething(Object object) {
        //缓存到redids
    }

    @SneakyThrows
    @Override
    public void invoke(Object converterData, AnalysisContext context) {
        List list = (List) converterData;
        int size = list.size();
        Integer currentRowNum = context.getCurrentRowNum();
        if (currentRowNum == 0){
            list .removeAll(Collections.singleton(null)); //移除所有的null元素
            int size2 = list.size();
            if (size != size2){
                throw new FormatterClosedException();
            };
        }
//        list .removeAll(Collections.singleton(null)); //移除所有的null元素
        for (int i = 0; i < list.size(); i++) {
            Object o = list.get(i);
            if (o == null){
                list.set(i,"");
            }
            if (o != null && isValidDate(o.toString())){
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                Date parse = dateFormat.parse(o.toString());
                list.set(i, DateUtil.dateToStr(parse,14));
            }
        }
        if (list.isEmpty()){
            return;
        }
        List<String> valueList = (List<String>) converterData;
        datas.add(valueList);
    }

    public void doAfterAllAnalysed(AnalysisContext context) {
//         datas.clear();//解析结束销毁不用的资源
    }

    public List<List<String>> getDatas (){
        return this.datas;
    }

    public void initialize(){
        this.datas = new ArrayList<>();
    }


    public static boolean isValidDate(String str) {
        boolean convertSuccess=true;
        // 指定日期格式为四位年/两位月份/两位日期，注意yyyy/MM/dd区分大小写；
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
        // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期，比如2007/02/29会被接受，并转换成2007/03/01
            format.setLenient(false);
            format.parse(str);
        } catch (ParseException e) {
            // e.printStackTrace();
// 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
            convertSuccess=false;
        }
        return convertSuccess;
    }

}